const express = require('express');
const { body } = require('express-validator');
const userController = require('../controllers/userController');
const { protect, restrictTo, optionalAuth } = require('../middleware/auth');
const rateLimit = require('express-rate-limit');

const router = express.Router();

// 限制用户操作请求的频率
const userLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100, // 限制每个IP 15分钟内最多100次请求
  message: {
    status: 'error',
    message: '请求过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 验证规则
const updateMeValidation = [
  body('firstName')
    .optional()
    .isLength({ min: 1, max: 50 })
    .withMessage('名字长度必须在1-50个字符之间')
    .trim(),
  
  body('lastName')
    .optional()
    .isLength({ min: 1, max: 50 })
    .withMessage('姓氏长度必须在1-50个字符之间')
    .trim(),
  
  body('phone')
    .optional()
    .isMobilePhone('zh-CN')
    .withMessage('请提供有效的手机号码'),
  
  body('dateOfBirth')
    .optional()
    .isISO8601()
    .withMessage('请提供有效的出生日期'),
  
  body('gender')
    .optional()
    .isIn(['male', 'female', 'other'])
    .withMessage('性别必须是 male、female 或 other'),
  
  body('address.street')
    .optional()
    .isLength({ min: 1, max: 200 })
    .withMessage('街道地址长度必须在1-200个字符之间'),
  
  body('address.city')
    .optional()
    .isLength({ min: 1, max: 100 })
    .withMessage('城市名称长度必须在1-100个字符之间'),
  
  body('address.postalCode')
    .optional()
    .isLength({ min: 1, max: 20 })
    .withMessage('邮政编码长度必须在1-20个字符之间'),
  
  body('address.country')
    .optional()
    .isLength({ min: 1, max: 100 })
    .withMessage('国家名称长度必须在1-100个字符之间')
];

const createUserValidation = [
  body('username')
    .isLength({ min: 3, max: 30 })
    .withMessage('用户名长度必须在3-30个字符之间')
    .matches(/^[a-zA-Z0-9_]+$/)
    .withMessage('用户名只能包含字母、数字和下划线'),
  
  body('email')
    .isEmail()
    .withMessage('请提供有效的邮箱地址')
    .normalizeEmail(),
  
  body('phone')
    .isMobilePhone('zh-CN')
    .withMessage('请提供有效的手机号码'),
  
  body('password')
    .isLength({ min: 8 })
    .withMessage('密码长度至少8个字符')
    .matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]/)
    .withMessage('密码必须包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符'),
  
  body('firstName')
    .isLength({ min: 1, max: 50 })
    .withMessage('名字长度必须在1-50个字符之间')
    .trim(),
  
  body('lastName')
    .isLength({ min: 1, max: 50 })
    .withMessage('姓氏长度必须在1-50个字符之间')
    .trim(),
  
  body('role')
    .optional()
    .isIn(['user', 'caregiver', 'admin'])
    .withMessage('角色必须是 user、caregiver 或 admin')
];

const updateUserValidation = [
  body('username')
    .optional()
    .isLength({ min: 3, max: 30 })
    .withMessage('用户名长度必须在3-30个字符之间')
    .matches(/^[a-zA-Z0-9_]+$/)
    .withMessage('用户名只能包含字母、数字和下划线'),
  
  body('email')
    .optional()
    .isEmail()
    .withMessage('请提供有效的邮箱地址')
    .normalizeEmail(),
  
  body('phone')
    .optional()
    .isMobilePhone('zh-CN')
    .withMessage('请提供有效的手机号码'),
  
  body('firstName')
    .optional()
    .isLength({ min: 1, max: 50 })
    .withMessage('名字长度必须在1-50个字符之间')
    .trim(),
  
  body('lastName')
    .optional()
    .isLength({ min: 1, max: 50 })
    .withMessage('姓氏长度必须在1-50个字符之间')
    .trim(),
  
  body('role')
    .optional()
    .isIn(['user', 'caregiver', 'admin'])
    .withMessage('角色必须是 user、caregiver 或 admin'),
  
  body('active')
    .optional()
    .isBoolean()
    .withMessage('active 必须是布尔值')
];

// 应用限流中间件到所有路由
router.use(userLimiter);

// 公开路由（可选认证）
/**
 * @route   GET /api/users/:id/public
 * @desc    获取用户公开信息
 * @access  Public
 */
router.get('/:id/public', optionalAuth, userController.getUserPublicInfo);

// 用户自己的操作（需要认证）

/**
 * @route   PATCH /api/users/update-me
 * @desc    更新当前用户信息
 * @access  Private
 */
router.patch('/update-me', protect, updateMeValidation, userController.updateMe);

/**
 * @route   DELETE /api/users/delete-me
 * @desc    删除当前用户账户（软删除）
 * @access  Private
 */
router.delete('/delete-me', protect, userController.deleteMe);

/**
 * @route   POST /api/users/upload-avatar
 * @desc    上传用户头像
 * @access  Private
 */
// TODO: 添加文件上传中间件
// router.post('/upload-avatar', protect, upload.single('avatar'), userController.uploadAvatar);

// 管理员操作（需要管理员权限）

/**
 * @route   GET /api/users/stats
 * @desc    获取用户统计信息
 * @access  Private/Admin
 */
router.get('/stats', protect, restrictTo('admin'), userController.getUserStats);

/**
 * @route   GET /api/users/search
 * @desc    搜索用户
 * @access  Private/Admin
 */
router.get('/search', protect, restrictTo('admin'), userController.searchUsers);

/**
 * @route   GET /api/users
 * @desc    获取所有用户
 * @access  Private/Admin
 */
router.get('/', protect, restrictTo('admin'), userController.getAllUsers);

/**
 * @route   POST /api/users
 * @desc    创建新用户
 * @access  Private/Admin
 */
router.post('/', protect, restrictTo('admin'), createUserValidation, userController.createUser);

/**
 * @route   GET /api/users/:id
 * @desc    获取单个用户信息
 * @access  Private/Admin
 */
router.get('/:id', protect, restrictTo('admin'), userController.getUser);

/**
 * @route   PATCH /api/users/:id
 * @desc    更新用户信息
 * @access  Private/Admin
 */
router.patch('/:id', protect, restrictTo('admin'), updateUserValidation, userController.updateUser);

/**
 * @route   DELETE /api/users/:id
 * @desc    删除用户
 * @access  Private/Admin
 */
router.delete('/:id', protect, restrictTo('admin'), userController.deleteUser);

/**
 * @route   PATCH /api/users/:id/toggle-status
 * @desc    激活/禁用用户
 * @access  Private/Admin
 */
router.patch('/:id/toggle-status', protect, restrictTo('admin'), userController.toggleUserStatus);

/**
 * @route   GET /api/users/:id/activity
 * @desc    获取用户活动日志
 * @access  Private/Admin
 */
router.get('/:id/activity', protect, restrictTo('admin'), userController.getUserActivity);

module.exports = router;